// package com.alibaba.druid.sql.ast;

// import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
// import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
// import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
// import com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser;
// import com.alibaba.druid.sql.parser.Lexer;
// import com.alibaba.druid.sql.parser.SQLParserFeature;
// import com.alibaba.druid.sql.parser.Token;
// import com.alibaba.druid.util.FnvHash;

// import java.util.ArrayList;
// import java.util.std::list;
#pragma once
#include <string>
#include <list>

#include "SQLCommentHint.h"

class SQLExpr;

class TDDLHint_Argument
{
public:
  SQLExpr_ptr name;
  SQLExpr_ptr value;

  TDDLHint_Argument(SQLExpr_ptr name, SQLExpr_ptr value)
  {
    this->name = name;
    this->value = value;
  }

  SQLExpr_ptr getName()
  {
    return name;
  }

  SQLExpr_ptr getValue()
  {
    return value;
  }
};

class TDDLHint_Function
{
public:
  string_ptr  name;
  TDDLHint_Argument_list_ptr arguments;

  TDDLHint_Function(string_ptr  name)
  {
    arguments = std::make_shared<std::list<TDDLHint_Argument_ptr>>();
    this->name = name;
  }

  string_ptr  getName()
  {
    return name;
  }

  TDDLHint_Argument_list_ptr getArguments()
  {
    return arguments;
  }
};

enum TDDLHint_Type
{
  Function,
  JSON,
  Unknown
};

class TDDLHint : virtual public SQLCommentHint
{
public:
  TDDLHint_Function_list_ptr functions;
  string_ptr  json;
  TDDLHint_Type type = TDDLHint_Type::Unknown;

  TDDLHint_Function_list_ptr getFunctions()
  {
    return functions;
  }

  TDDLHint(string_ptr  text);

  string_ptr  getJson()
  {
    return json;
  }

  TDDLHint_Type getType()
  {
    return type;
  }
};
